{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "sixth-static",
   "metadata": {},
   "source": [
    "# Gene Regulatory Network Tutorial\n",
    "\n",
    "In this tutorial we run through GRN graph construction in Graphein. This works by providing a `gene_list` containing gene names. The interactions between these genes are retrieved from two possible sources:\n",
    "* TRRUST\n",
    "* RegNetwork\n",
    "\n",
    "This is controlled by providing an edge construction function (`add_trrust_edges` and `add_regnetwork_edges`) respectively."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "stupid-billion",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:numexpr.utils:Note: NumExpr detected 64 cores but \"NUMEXPR_MAX_THREADS\" not set, so enforcing safe limit of 8.\n",
      "INFO:numexpr.utils:NumExpr defaulting to 8 threads.\n"
     ]
    }
   ],
   "source": [
    "import networkx as nx\n",
    "from functools import partial\n",
    "from typing import List\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import logging\n",
    "logging.basicConfig(level=logging.INFO)\n",
    "from easydev import Logging as elogging\n",
    "elogging.level = \"CRITICAL\"\n",
    "\n",
    "from graphein.grn.edges import add_regnetwork_edges, add_trrust_edges"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "italic-trance",
   "metadata": {},
   "source": [
    "## Config Objects\n",
    "Global parameters are stored in Config objects. We have a global `GRNGraphConfig` that contains a `TRRUSTConfig` and a `RegNetworkConfig` for parameters relating to each of the two sources."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "copyrighted-adjustment",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GRN Config: \n",
      "kwargs={} trrust_config=TRRUSTConfig(filtering_functions=None, root_dir=None, kwargs=None) regnetwork_config=RegNetworkConfig(filtering_functions=None, root_dir=None, kwargs=None) \n",
      "\n",
      "TRRUST Config: \n",
      "filtering_functions=None root_dir=None kwargs=None \n",
      "\n",
      "RegNetwork Config: \n",
      "filtering_functions=None root_dir=None kwargs=None\n"
     ]
    }
   ],
   "source": [
    "# Initialise Config Object\n",
    "from graphein.grn.config import GRNGraphConfig\n",
    "config = GRNGraphConfig()\n",
    "print(f\"GRN Config: \\n{config} \\n\")\n",
    "print(f\"TRRUST Config: \\n{config.trrust_config} \\n\")\n",
    "print(f\"RegNetwork Config: \\n{config.regnetwork_config}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sweet-roller",
   "metadata": {},
   "source": [
    "## Gene List\n",
    "This is the list of genes that we wish to construct a GRN graph for"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "british-discrimination",
   "metadata": {},
   "outputs": [],
   "source": [
    "gene_list: List[str] = [\"AATF\", \"MYC\", \"USF1\", \"SP1\", \"TP53\", \"DUSP1\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "variable-magic",
   "metadata": {},
   "source": [
    "## Edge Annotation Functions\n",
    "These are functions that determine labelling of edges with additional metadata. Here we define one which assigs:\n",
    "    * `\"+\"` to upregulatory interactions\n",
    "    * `\"-\"` to downregulatory interactions\n",
    "    * `\"?\"` to interactons of unknown directionality\n",
    "    \n",
    "Edge Annotation functions take in two nodes (`u`, `v`) and the edge data (`d`)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "sixth-contribution",
   "metadata": {},
   "outputs": [],
   "source": [
    "# This function defines the labelling of regulatory directions\n",
    "def edge_ann_fn(u, v, d):\n",
    "    if \"+\" in d[\"regtype\"]:\n",
    "        d[\"regtype\"] = \"+\"\n",
    "    elif \"-\" in d[\"regtype\"]:\n",
    "        d[\"regtype\"] = \"-\"\n",
    "    elif \"?\" in d[\"regtype\"]:\n",
    "        d[\"regtype\"] = \"?\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "quality-exercise",
   "metadata": {},
   "source": [
    "## Graph Construction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "purple-faculty",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">[01/09/23 19:06:00] </span><span style=\"color: #008000; text-decoration-color: #008000\">DEBUG   </span> Added <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span> nodes to graph                              <a href=\"file:///home/atj39/github/graphein/graphein/grn/graphs.py\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">graphs.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:</span><a href=\"file:///home/atj39/github/graphein/graphein/grn/graphs.py#90\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">90</span></a>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m[01/09/23 19:06:00]\u001b[0m\u001b[2;36m \u001b[0m\u001b[32mDEBUG   \u001b[0m Added \u001b[1;36m6\u001b[0m nodes to graph                              \u001b]8;id=927067;file:///home/atj39/github/graphein/graphein/grn/graphs.py\u001b\\\u001b[2mgraphs.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=156453;file:///home/atj39/github/graphein/graphein/grn/graphs.py#90\u001b\\\u001b[2m90\u001b[0m\u001b]8;;\u001b\\\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "\u001b[33mWARNING [bioservices.HGNC:687]: \u001b[0m \u001b[32mURL of the services contains a double //.Check your URL and remove trailing /\u001b[0m\n",
      "WARNING:bioservices.HGNC:URL of the services contains a double //.Check your URL and remove trailing /\n",
      "/home/atj39/github/graphein/graphein/grn/parse_trrust.py:128: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df[\"regtype\"].replace(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">[01/09/23 19:06:13] </span><span style=\"color: #008000; text-decoration-color: #008000\">DEBUG   </span> Added <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> trrust interaction edges                    <a href=\"file:///home/atj39/github/graphein/graphein/grn/edges.py\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">edges.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:</span><a href=\"file:///home/atj39/github/graphein/graphein/grn/edges.py#94\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">94</span></a>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m[01/09/23 19:06:13]\u001b[0m\u001b[2;36m \u001b[0m\u001b[32mDEBUG   \u001b[0m Added \u001b[1;36m10\u001b[0m trrust interaction edges                    \u001b]8;id=617190;file:///home/atj39/github/graphein/graphein/grn/edges.py\u001b\\\u001b[2medges.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=853367;file:///home/atj39/github/graphein/graphein/grn/edges.py#94\u001b\\\u001b[2m94\u001b[0m\u001b]8;;\u001b\\\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/atj39/github/graphein/graphein/grn/parse_regnetwork.py:235: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df[\"source\"] = \"RegNetwork\"\n",
      "/home/atj39/github/graphein/graphein/grn/parse_regnetwork.py:238: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df[\"regtype\"].replace(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #008000; text-decoration-color: #008000\">DEBUG   </span> Added <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">23</span> regnetwork interaction edges                <a href=\"file:///home/atj39/github/graphein/graphein/grn/edges.py\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">edges.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:</span><a href=\"file:///home/atj39/github/graphein/graphein/grn/edges.py#94\" target=\"_blank\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">94</span></a>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[32mDEBUG   \u001b[0m Added \u001b[1;36m23\u001b[0m regnetwork interaction edges                \u001b]8;id=244158;file:///home/atj39/github/graphein/graphein/grn/edges.py\u001b\\\u001b[2medges.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=991258;file:///home/atj39/github/graphein/graphein/grn/edges.py#94\u001b\\\u001b[2m94\u001b[0m\u001b]8;;\u001b\\\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from graphein.grn.graphs import compute_grn_graph\n",
    "from graphein.grn.features.node_features import add_sequence_to_nodes\n",
    "\n",
    "g = compute_grn_graph(\n",
    "    gene_list=gene_list,\n",
    "    edge_construction_funcs=[\n",
    "        partial(add_trrust_edges, trrust_filtering_funcs=config.trrust_config.filtering_functions),\n",
    "        partial(add_regnetwork_edges, regnetwork_filtering_funcs=config.regnetwork_config.filtering_functions),\n",
    "    ],\n",
    "    node_annotation_funcs=[add_sequence_to_nodes],#, molecular_weight],\n",
    "    edge_annotation_funcs=[edge_ann_fn],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "broad-lemon",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AATF {'gene_id': 'AATF', 'uniprot_ids': ['Q9NY61'], 'sequence_Q9NY61': 'MAGPQPLALQLEQLLNPRPSEADPEADPEEATAARVIDRFDEGEDGEGDFLVVGSIRKLASASLLDTDKRYCGKTTSRKAWNEDHWEQTLPGSSDEEISDEEGSGDEDSEGLGLEEYDEDDLGAAEEQECGDHRESKKSRSHSAKTPGFSVQSISDFEKFTKGMDDLGSSEEEEDEESGMEEGDDAEDSQGESEEDRAGDRNSEDDGVVMTFSSVKVSEEVEKGRAVKNQIALWDQLLEGRIKLQKALLTTNQLPQPDVFPLFKDKGGPEFSSALKNSHKALKALLRSLVGLQEELLFQYPDTRYLVDGTKPNAGSEEISSEDDELVEEKKQQRRRVPAKRKLEMEDYPSFMAKRFADFTVYRNRTLQKWHDKTKLASGKLGKGFGAFERSILTQIDHILMDKERLLRRTQTKRSVYRVLGKPEPAAQPVPESLPGEPEILPQAPANAHLKDLDEEIFDDDDFYHQLLRELIERKTSSLDPNDQVAMGRQWLAIQKLRSKIHKKVDRKASKGRKLRFHVLSKLLSFMAPIDHTTMNDDARTELYRSLFGQLHPPDEGHGD'}\n",
      "MYC {'gene_id': 'MYC', 'uniprot_ids': ['P01106'], 'sequence_P01106': 'MPLNVSFTNRNYDLDYDSVQPYFYCDEEENFYQQQQQSELQPPAPSEDIWKKFELLPTPPLSPSRRSGLCSPSYVAVTPFSLRGDNDGGGGSFSTADQLEMVTELLGGDMVNQSFICDPDDETFIKNIIIQDCMWSGFSAAAKLVSEKLASYQAARKDSGSPNPARGHSVCSTSSLYLQDLSAAASECIDPSVVFPYPLNDSSSPKSCASQDSSAFSPSSDSLLSSTESSPQGSPEPLVLHEETPPTTSSDSEEEQEDEEEIDVVSVEKRQAPGKRSESGSPSAGGHSKPPHSPLVLKRCHVSTHQHNYAAPPSTRKDYPAAKRVKLDSVRVLRQISNNRKCTSPRSSDTEENVKRRTHNVLERQRRNELKRSFFALRDQIPELENNEKAPKVVILKKATAYILSVQAEEQKLISEEDLLRKRREQLKHKLEQLRNSCA'}\n",
      "USF1 {'gene_id': 'USF1', 'uniprot_ids': ['P22415'], 'sequence_P22415': 'MKGQQKTAETEEGTVQIQEGAVATGEDPTSVAIASIQSAATFPDPNVKYVFRTENGGQVMYRVIQVSEGQLDGQTEGTGAISGYPATQSMTQAVIQGAFTSDDAVDTEGTAAETHYTYFPSTAVGDGAGGTTSGSTAAVVTTQGSEALLGQATPPGTGQFFVMMSPQEVLQGGSQRSIAPRTHPYSPKSEAPRTTRDEKRRAQHNEVERRRRDKINNWIVQLSKIIPDCSMESTKSGQSKGGILSKACDYIQELRQSNHRLSEELQGLDQLQLDNDVLRQQVEDLKNKNLLLRAQLRHHGLEVVIKNDSN'}\n",
      "SP1 {'gene_id': 'SP1', 'uniprot_ids': ['P08047'], 'sequence_P08047': 'MSDQDHSMDEMTAVVKIEKGVGGNNGGNGNGGGAFSQARSSSTGSSSSTGGGGQESQPSPLALLAATCSRIESPNENSNNSQGPSQSGGTGELDLTATQLSQGANGWQIISSSSGATPTSKEQSGSSTNGSNGSESSKNRTVSGGQYVVAAAPNLQNQQVLTGLPGVMPNIQYQVIPQFQTVDGQQLQFAATGAQVQQDGSGQIQIIPGANQQIITNRGSGGNIIAAMPNLLQQAVPLQGLANNVLSGQTQYVTNVPVALNGNITLLPVNSVSAATLTPSSQAVTISSSGSQESGSQPVTSGTTISSASLVSSQASSSSFFTNANSYSTTTTTSNMGIMNFTTSGSSGTNSQGQTPQRVSGLQGSDALNIQQNQTSGGSLQAGQQKEGEQNQQTQQQQILIQPQLVQGGQALQALQAAPLSGQTFTTQAISQETLQNLQLQAVPNSGPIIIRTPTVGPNGQVSWQTLQLQNLQVQNPQAQTITLAPMQGVSLGQTSSSNTTLTPIASAASIPAGTVTVNAAQLSSMPGLQTINLSALGTSGIQVHPIQGLPLAIANAPGDHGAQLGLHGAGGDGIHDDTAGGEEGENSPDAQPQAGRRTRREACTCPYCKDSEGRGSGDPGKKKQHICHIQGCGKVYGKTSHLRAHLRWHTGERPFMCTWSYCGKRFTRSDELQRHKRTHTGEKKFACPECPKRFMRSDHLSKHIKTHQNKKGGPGVALSVGTLPLDSGAGSEGSGTATPSALITTNMVAMEAICPEGIARLANSGINVMQVADLQSINISGNGF'}\n",
      "TP53 {'gene_id': 'TP53', 'uniprot_ids': ['P04637'], 'sequence_P04637': 'MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSDSDGLAPPQHLIRVEGNLRVEYLDDRNTFRHSVVVPYEPPEVGSDCTTIHYNYMCNSSCMGGMNRRPILTIITLEDSSGNLLGRNSFEVRVCACPGRDRRTEEENLRKKGEPHHELPPGSTKRALPNNTSSSPQPKKKPLDGEYFTLQIRGRERFEMFRELNEALELKDAQAGKEPGGSRAHSSHLKSKKGQSTSRHKKLMFKTEGPDSD'}\n",
      "DUSP1 {'gene_id': 'DUSP1', 'uniprot_ids': ['P28562'], 'sequence_P28562': 'MVMEVGTLDAGGLRALLGERAAQCLLLDCRSFFAFNAGHIAGSVNVRFSTIVRRRAKGAMGLEHIVPNAELRGRLLAGAYHAVVLLDERSAALDGAKRDGTLALAAGALCREARAAQVFFLKGGYEAFSASCPELCSKQSTPMGLSLPLSTSVPDSAESGCSSCSTPLYDQGGPVEILPFLYLGSAYHASRKDMLDALGITALINVSANCPNHFEGHYQYKSIPVEDNHKADISSWFNEAIDFIDSIKNAGGRVFVHCQAGISRSATICLAYLMRTNRVKLDEAFEFVKQRRSIISPNFSFMGQLLQFESQVLAPHCSAEAGSPAMAVLDRGTSTTTVFNFPVSIPVHSTNSALSYLQSPITTSPSC'}\n"
     ]
    }
   ],
   "source": [
    "for n,d in g.nodes(data=True):\n",
    "    print(n, d)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bearing-newton",
   "metadata": {},
   "source": [
    "## Plotting the Graph\n",
    "We now wish to visualise the graph. We can do this with the built in visualisation in NetworkX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "organizational-teacher",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DiGraph with 6 nodes and 22 edges\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Here we define a colouring scheme for the graph\n",
    "edge_colors = [\n",
    "    \"r\"\n",
    "    if g[u][v][\"kind\"] == {\"trrust\"}\n",
    "    else \"b\"\n",
    "    if g[u][v][\"kind\"] == {\"regnetwork\"}\n",
    "    else \"y\"\n",
    "    for u, v in g.edges()\n",
    "]\n",
    "\n",
    "print(g)\n",
    "\n",
    "pos = nx.spring_layout(g)\n",
    "nx.draw(g, pos=pos, with_labels=True, edge_color=edge_colors)\n",
    "edge_labels = {(u, v): g[u][v][\"regtype\"] for u, v in g.edges}\n",
    "nx.draw_networkx_edge_labels(g, pos=pos, edge_labels=edge_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "expected-scholarship",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('AATF', 'TP53', {'kind': {'trrust'}, 'regtype': '?'}), ('AATF', 'MYC', {'kind': {'trrust'}, 'regtype': '+'}), ('AATF', 'SP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('MYC', 'TP53', {'kind': {'trrust', 'regnetwork'}, 'regtype': '+'}), ('MYC', 'SP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('MYC', 'DUSP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('MYC', 'MYC', {'kind': {'regnetwork'}, 'regtype': '?'}), ('USF1', 'DUSP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('USF1', 'SP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('USF1', 'USF1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('USF1', 'AATF', {'kind': {'regnetwork'}, 'regtype': '?'}), ('USF1', 'TP53', {'kind': {'regnetwork'}, 'regtype': '?'}), ('SP1', 'MYC', {'kind': {'trrust', 'regnetwork'}, 'regtype': '+'}), ('SP1', 'SP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('SP1', 'TP53', {'kind': {'regnetwork'}, 'regtype': '?'}), ('SP1', 'USF1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('SP1', 'AATF', {'kind': {'regnetwork'}, 'regtype': '?'}), ('SP1', 'DUSP1', {'kind': {'regnetwork'}, 'regtype': '?'}), ('TP53', 'MYC', {'kind': {'trrust', 'regnetwork'}, 'regtype': '-'}), ('TP53', 'TP53', {'kind': {'trrust', 'regnetwork'}, 'regtype': '+'}), ('TP53', 'DUSP1', {'kind': {'trrust', 'regnetwork'}, 'regtype': '+'}), ('TP53', 'SP1', {'kind': {'regnetwork'}, 'regtype': '?'})]\n"
     ]
    }
   ],
   "source": [
    "print(g.edges(data=True))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "graphein",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  },
  "vscode": {
   "interpreter": {
    "hash": "0ab7f988027852efc1ebacd06db3f130eb65d2a20cb6a366311359132c20a952"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
